package com.atguigu.ssyx.user.controller;


import com.alibaba.fastjson.JSONObject;
import com.atguigu.ssyx.common.auth.AuthContextHolder;
import com.atguigu.ssyx.common.constant.RedisConst;
import com.atguigu.ssyx.common.exception.SsyxException;
import com.atguigu.ssyx.common.result.Result;
import com.atguigu.ssyx.common.result.ResultCodeEnum;
import com.atguigu.ssyx.common.utils.JwtHelper;
import com.atguigu.ssyx.enums.UserType;
import com.atguigu.ssyx.model.user.User;
import com.atguigu.ssyx.user.service.UserService;
import com.atguigu.ssyx.user.utils.ConstantPropertiesUtil;
import com.atguigu.ssyx.user.utils.HttpClientUtils;
import com.atguigu.ssyx.vo.user.LeaderAddressVo;
import com.atguigu.ssyx.vo.user.UserLoginVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * Created with IntelliJ IDEA.
 * ClassName: WeixinApiController
 * Package: com.atguigu.ssyx.user.controller
 * Description:
 * User: fzykd
 *
 * @Author: LQH
 * Date: 2023-10-02
 * Time: 13:41
 */

@Api(tags = "微信小程序接口")
@RestController
@RequestMapping("/api/user/weixin")
public class WeixinApiController {

    @Autowired
    private UserService userService;

    @Autowired
    private RedisTemplate redisTemplate;

    //用户微信授权登录 接口在微信小程序前端找到
    @ApiOperation("微信登录接口")
    @GetMapping("/wxLogin/{code}")
    public Result loginWx(@PathVariable String code) {
        //这个code是 微信小程序自带的 从前端传过来的

        //1.得到微信返回的code临时票据值

        //2 拿着code + 小程序Id + 小程序密钥 请求微信固定接口的服务
        String wxOpenAppId = ConstantPropertiesUtil.WX_OPEN_APP_ID;
        String wxOpenAppSecret = ConstantPropertiesUtil.WX_OPEN_APP_SECRET;
        // 使用HttpClient工具类请求
        //发送Get请求
        StringBuffer url = new StringBuffer()
                //微信固定的接口路径
                .append("https://api.weixin.qq.com/sns/jscode2session")
                //%s占位符 可以传参数 参数名字也是官方约定好的
                .append("?appid=%s")
                .append("&secret=%s")
                .append("&js_code=%s")
                .append("&grant_type=authorization_code");
        //这些参数的名称也是固定的
        String tokenUrl =
                String.format(url.toString(), wxOpenAppId, wxOpenAppSecret, code);

        //使用Http工具类 发送请求
        String result = null;
        try {
            //get方法 发送请求
            result = HttpClientUtils.get(tokenUrl);
        } catch (Exception e) {
            throw new SsyxException(ResultCodeEnum.FETCH_USERINFO_ERROR);
        }

        System.out.println("result----------->  : " + result);
        //返回的result 包括session_key 和 openId 本身是字符串 从里面取值
        //3.请求微信接口服务 返回两个值 session 和 openId
        //openId 是微信的唯一标识
        //将字符串转成JSON 通过json取值
        JSONObject jsonObject = JSONObject.parseObject(result);
        //通过这个转为JSON 直接使用名字取出值
        String session_key = jsonObject.getString("session_key");
        String openId = jsonObject.getString("openid");

        //4.添加微信用户信息到数据库中
        //操作user表
        //判断是否是第一次使用微信授权登录 根据openId判断
        User user = userService.getUserByOpenId(openId);
        if (user == null){
            //查不到 说明是第一次登录
            //添加到数据库
            user = new User();
            user.setOpenId(openId);
            user.setNickName(openId);
            user.setPhotoUrl("");
            user.setUserType(UserType.USER);
            user.setIsNew(0);
            userService.save(user);
        }

        //5.根据userId查询提货点和团长信息
        //提货点 user_delivery表
        // 团长 leader表
        LeaderAddressVo leaderAddressVo =
                //这个方法 在首页数据中也用到了 远程调用的方法
                userService.getLeaderAddressByUserId(user.getId());
        //6 使用JWT工具生成userId和userName的token字符串
        String token = JwtHelper.createToken(user.getId(), user.getNickName());

        //7.获取当前用户登陆的信息 放到Redis中 设置有限时间 封装到更丰富的userLoginVo中
        UserLoginVo userLoginVo = userService.getUserLoginVo(user.getId());
        //将数据放到Redis中去
        redisTemplate.opsForValue()
                .set(RedisConst.USER_LOGIN_KEY_PREFIX + user.getId(),
                        userLoginVo,
                        RedisConst.USERKEY_TIMEOUT,
                        TimeUnit.DAYS);

        //8 需要封装数据返回map
        Map<String,Object> map = new HashMap();
        map.put("user",user);
        map.put("token",token);
        map.put("leaderAddressVo",leaderAddressVo);
        return Result.ok(map);
    }


    //测试拦截器的方法
    //跟新用户信息接口
    //auth/updateUser
    @ApiOperation("更新用户信息接口")
    @PostMapping("/auth/updateUser")
    public Result updateUser(@RequestBody User user){
        //获取当前登录的用户Id
        User user1 = userService.getById(AuthContextHolder.getUserId());
        //把昵称更新为微信用户
        user1.setNickName(user.getNickName().replaceAll("[ue000-uefff]","*"));
        user1.setPhotoUrl(user.getPhotoUrl());
        userService.updateById(user1);
        return Result.ok(null);
    }


}
